package proxy.cglib;



import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * 代理对象工厂
 */
public class ProxyFactory implements MethodInterceptor {

    private HWContractor hwContractor = new HWContractor();

    /**
     * CGLib 代理类，属于目标类的子类，所以此处返回类型为 HWContractor
     * @return
     */
    public HWContractor getProxyFactory(){
        // 1、创建 Enhancer 对象，类似 JDK 动态代理中的 Proxy 类
        Enhancer enhancer = new Enhancer();
        // 2、设置父类字节码对象，指定代理类的父类
        enhancer.setSuperclass(HWContractor.class);
        // 3、设置回调函数 (ProxyFactory implements MethodInterceptor)
        // 这里写 匿名内部类 也行
        enhancer.setCallback(this);
        // 4、创建代理对象
        HWContractor proxyObj = (HWContractor) enhancer.create();

        return proxyObj;
    }

    /**
     *
     * @param o 代理对象
     * @param method 对应调用方法的Method对象
     * @param objects 实际参数
     * @param methodProxy
     * @return
     * @throws Throwable
     */
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        //System.out.println("intercept 执行了....");
        System.out.println("代售点赚取手续费");
        // 调用目标方法
        // 方式一：
        // hwContractor.sell();
        // 方式二：采取反射的思路
        Object invoke = method.invoke(hwContractor, objects);

        return invoke;
    }
}
